package game;

import java.util.*;


public class SingleGame{
	private int userID;	
	private boolean isNew=true;
	private String word=null;
	private int points = 100, errorCount = 0;
	private boolean win=false, stop=false;
	private Date startTime=null, endTime=null;
	
	
	public SingleGame(int userID, String word){
		this.userID = userID;
		this.word = word;
		startTime = new Date();
	}
	
	public int getErrorCount(){
		return errorCount;
	}
	
	public boolean isNew(){
		return isNew;
	}
	
	
	public int getFuturePoints(){
		//предполагаем, что все буквы стоят одинаково. Т.е. не угадал игрок слово - одна буква проявилась и очки, соответствующие этой букве сняты
		return (int)(points*(1-((double)errorCount)/((double)word.length())));
	}

	/**
		прекращает игру
	*/
	public void stop(){
		stop = true;
		if(endTime==null)
			endTime = new Date();
	}
	
	
	/**
		возвращает true, если игра еще не закончена
	*/
	public boolean run(){
		return !stop;
	}
	
	
	/**
		добавляет на проверку слово
	*/
	public void addAnswer(String answer){
		if(answer==null || stop) 
			return;
		
		isNew = false;
		if(answer.equals(word)){
			win = true;
			stop();
		}else errorCount++;
		
		if(errorCount==word.length())
			stop();
	}
	
	
	/**
		возвращает закодированное слово с учетом ошибок: сколько было ошибок, столько правильных букв стоит вначале
	*/
	public String getEncodeWord(){
		Random rand = new Random(System.currentTimeMillis());
		StringBuffer encodeWord = new StringBuffer(word);
		
		for(int i=errorCount; i<word.length(); i++){
			int rnd = i + rand.nextInt(word.length() - i);
			char buf = encodeWord.charAt(i);
			encodeWord.setCharAt(i, encodeWord.charAt(rnd));
			encodeWord.setCharAt(rnd, buf);
		}
		return encodeWord.toString();
	}
	
	
	/**
		возвращает true, если игрок выиграл
	*/
	public boolean win(){
		return win;
	}
	
	
	/**
		возвращает время начала игры
	*/	
	public Date getStartTime(){
		return startTime;
	}
	
	
	/**
		возвращает время окончания игры
	*/
	public Date getEndTime(){
		return endTime;
	}
	
	/**
		возвращает количество заработанных очков
	*/
	public int getResult(){
		if(!win) 
			return 0;  //если игра не выиграна, игрок ничего не заработал
		else
			return getFuturePoints();
	}
	
	
	/**
		возвращает сложность данной игры
	*/
	public int getDifficulty(){
		return word.length();
	}
	
	public int getUserID(){
		return userID;
	}
	
	
	public void setUserID(int userID){
		this.userID = userID;
	}
}